import Vue from 'vue';
import axios from 'axios';
// import { Toast } from 'vant';
// 取消请求
// const { CancelToken } = axios;
// 设置默认请求头，如果不需要可以取消这一步
// axios.defaults.headers = {
//   'X-Requested-With': 'XMLHttpRequest',
// };
// 请求超时的时间限
axios.defaults.timeout = 20000;
axios.defaults.withCredentials = true;
axios.defaults.baseURL = '';

// 开始设置请求 发起的拦截处理
// config 代表发起请求的参数的实体
axios.interceptors.request.use((config) => {
  // 得到参数中的 requestName 字段，用于决定下次发起请求，取消对应的 相同字段的请求
  // 如果没有 requestName 就默认添加一个 不同的时间戳
  let requestName;
  if (config.method === 'post') {
    if (config.data && config.data.requestName) {
      requestName = config.data;
    } else {
      requestName = new Date().getTime();
    }
  } else if (config.params && config.params.requestName) {
    requestName = config.params;
  } else {
    requestName = new Date().getTime();
  }
  // 判断，如果这里拿到的参数中的 requestName 在上一次请求中已经存在，就取消上一次的请求
  if (requestName) {
    if (axios[requestName] && axios[requestName].cancel) {
      axios[requestName].cancel();
    }
  }
  return config;
}, error => Promise.reject(error));

// 请求到结果的拦截处理
axios.interceptors.response.use(res => res.data,
  (error) => {
    let message = '';
    // 错误的请求结果处理，这里的代码根据后台的状态码来决定错误的输出信息
    if (error && error.response) {
      switch (error.response.status) {
        case 400:
          message = '错误请求';
          break;
        default:
          message = `连接错误${error.response.status}`;
      }
    } else {
      message = '连接到服务器失败';
    }
    return Promise.reject(message);
  });
// 将axios 的 post 方法，绑定到 vue 实例上面的 $post
Vue.prototype.$post = (url, params) => new Promise((resolve, reject) => {
  axios.post(url, params)
    .then((res) => {
      resolve(res);
    }).catch((err) => {
      reject(err);
    });
});
// 将axios 的 get 方法，绑定到 vue 实例上面的 $get
Vue.prototype.$get = (url, params = {}) => new Promise((resolve, reject) => {
  axios.get(url, {
    params,
  }).then(res => resolve(res))
    .catch(err => reject(err));
});
// 请求示例
// requestName 为多余的参数 作为请求的标识，下次发起相同的请求，就会自动取消上一次还没有结束的请求
// 比如正常的请求参数只有一个 name: '123'，但是这里我们需要额外再加上一个 requestName
/**
 this.$post(url, { name: '123', requestName: 'post_1' })
 .then(res => {
            console.log(`请求成功：${res}`)
        })
 */

export default axios;
